package com.zy.explore.common.infrastructure.base.mybatis;

import java.util.List;

/**
 * 标准Service，Mybatis框架服务层接口基类，继承它的Service接口拥有Mybatis的基本CRUD方法
 *
 * @author ChinaYin  主页:https://gitee.com/zy-explorej2ee 邮箱:zyexplorej2ee@sina.com
 * @date 2021年06月13日 14:17:21
 */
public interface BaseService<T, ID, EXAMPLE> {

    /**
     * 根据主键获取对象
     *
     * @param key 主键
     * @return 实体对象
     */
    T getByPrimaryKey(ID key);

    /**
     * 根据条件查询列表
     *
     * @param example 条件参数
     * @return 返回满足条件的集合
     */
    List<T> selectByExample(EXAMPLE example);

    /**
     * 单个实体对象全量字段保存
     *
     * @param record 待新增的对象
     * @return 返回新增的对象
     */
    T insert(T record);

    /**
     * 单个实体对象非空字段保存
     *
     * @param record 待新增的对象
     * @return 返回新增的对象
     */
    T insertSelective(T record);

    /**
     * 多个实体对象保存
     *
     * @param list 待新增的实体对象集合
     * @return 返回新增的实体对象的数量
     */
    int insertList(List<? extends T> list);

    /**
     * 单个实体对象主键删除
     *
     * @param key 主键
     * @return 1.成功 0.失败
     */
    int deleteByPrimaryKey(ID key);

    /**
     * 单个实体对象删除
     *
     * @param record 删除的对象
     * @return 1.成功 0.失败
     */
    int delete(T record);

    /**
     * 单个实体对象条件删除
     *
     * @param example 条件对象
     * @return 1.成功 0.失败
     */
    int deleteByExample(EXAMPLE example);

    /**
     * 单个实体对象主键全量字段更新
     *
     * @param record 待更新的对象
     * @return 1.成功 0.失败
     */
    int updateByPrimaryKey(T record);

    /**
     * 单个实体对象主键非空字段更新
     *
     * @param record 待更新的对象
     * @return 1.成功 0.失败
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * 单个实体对象条件全量字段更新
     *
     * @param record  待更新的对象
     * @param example 条件
     * @return 1.成功 0.失败
     */
    int updateByExample(T record, EXAMPLE example);

    /**
     * 单个实体对象条件非空字段更新
     *
     * @param record  待更新的对象
     * @param example 条件
     * @return 1.成功 0.失败
     */
    int updateByExampleSelective(T record, EXAMPLE example);

}
